package com.zzyl.service.impl;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.zzyl.enums.BasicEnum;
import com.zzyl.exception.BaseException;
import com.zzyl.service.WechatService;
import com.zzyl.utils.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
@Slf4j
public class WechatServiceImpl implements WechatService {

    // 登录
    private static final String REQUEST_URL = "https://api.weixin.qq.com/sns/jscode2session?grant_type=authorization_code";

    // 获取token
    private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";

    // 获取手机号
    private static final String PHONE_REQUEST_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";
    @Value("${zzyl.wechat.appId}")
    private String appId;
    @Value("${zzyl.wechat.appSecret}")
    private String appSecret;

    @Override
    public String getOpenid(String code) {
         //定义Map存储参数
        Map<String, Object>map=new HashMap<>();
        map.put("appid",appId);
        map.put("secret",appSecret);
        map.put("js_code",code);
        //使用hutool工具远程调用返回json字符串
        String json = HttpUtil.get(REQUEST_URL, map);
        //将json字符串封装成Jsonobject(本质就是map)
        JSONObject jsonObject = JSONUtil.parseObj(json);
        //解析里面是否有errcode，有代表发生错误，抛出异常
        if (ObjectUtil.isNotEmpty(jsonObject.get("errcode"))){
           throw new BaseException(BasicEnum.GET_OPENID_ERROR);
        }
        //没有错误，解析里面数据openid，返回
        return jsonObject.get("openid").toString();
    }
//获取手机号
    @Override
    public String getPhone(String code) {
        //定义Map存储参数
        Map<String, Object>map=new HashMap<>();
        String path=PHONE_REQUEST_URL+getAccessToken();
      map.put("code",code);
        //使用hutool工具远程调用返回json字符串
        String json = HttpUtil.post(path, JSONUtil.toJsonStr(map));
        //将json字符串封装成Jsonobject(本质就是map)
        JSONObject jsonObject = JSONUtil.parseObj(json);
        //解析里面是否有errcode，有代表发生错误，抛出异常
     Integer errcode = Integer.parseInt(jsonObject.get("errcode").toString());
        if (errcode!=null&&errcode!=0){
            throw new BaseException(BasicEnum.GET_OPENID_ERROR);
        }
        //没有错误，解析里面数据openid，返回
        return jsonObject.getJSONObject("phone_info").get("purePhoneNumber").toString();
    }
    //获取token
    private String getAccessToken(){
        //定义Map存储参数
        Map<String, Object>map=new HashMap<>();
        map.put("appid",appId);
        map.put("secret",appSecret);
        //使用hutool工具远程调用返回json字符串
        String json = HttpUtil.get(TOKEN_URL, map);
        //将json字符串封装成Jsonobject(本质就是map)
        JSONObject jsonObject = JSONUtil.parseObj(json);
        //解析里面是否有errcode，有代表发生错误，抛出异常
        if (ObjectUtil.isNotEmpty(jsonObject.get("errcode"))){
            throw new BaseException(BasicEnum.GET_OPENID_ERROR);
        }
        //没有错误，解析里面数据openid，返回
        return jsonObject.get("access_token").toString();
    }
}
